/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package educar.models;

import educar.db.JPA;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Date;
import java.sql.ResultSet;


/**
 *En esta clase se encuentran lo metodos necesario para que un Alumno 
 * pueda administrar una Resolucion.
 * @author Flubber
 */
public class Resolucion {
    
        private static JPA jpa = new JPA(); //Atributo <code>JPA</code> usado para cear una instancia que contenga un query
        java.util.Date utilDate; //Atributo <code>java.util.Date</code> para obtener la fecha actual
        long lnMilisegundos;   //Atributo <code>long</code> para obtener la hora actual
        private Date fecha; //Atributo <code>Date</code> para guardar la fecha actual
        private Time hora;  //Atributo <code>Time</code> para guardar la hora actual
        private String nroAlumno;   //<code>String</code> usada para almacenar el nro de un alumno.
	private String codActividad;    //<code>String</code> usada para almacenar el codigo de una actividad.
        private String solucion;    //<code>String</code> usada para almacenar una solucion de una resolucion.

        
    /**
     * <hr>
     * Resolucion(): Contructor con parametros de la clase Resolucion.
     * <hr>
     * @param nroAlumno
     * @param codActividad
     * @param solucion
     */
    public Resolucion (String nroAlumno, String codActividad, String solucion) {     
        utilDate = new java.util.Date();
        lnMilisegundos = utilDate.getTime();
        this.fecha = new java.sql.Date(lnMilisegundos);
        this.hora = new java.sql.Time(lnMilisegundos);
        this.setNroAlumno(nroAlumno);
        this.setCodActividad(codActividad);
        this.setSolucion(solucion);                	
    }//Fin del metodo Resolucion(String, String, String).

    
    /**
     * <hr>
     * Resolucion(): Constructor que recibe como parametro un arreglo.
     * <hr>
     * @param resolucion Un <code>String[]</code> que contiene los datos necesarios para de una resolucion.
     */
    public Resolucion (String[] resolucion) {
        utilDate = new java.util.Date();
        lnMilisegundos = utilDate.getTime();
        this.fecha = new java.sql.Date(lnMilisegundos);
        this.hora = new java.sql.Time(lnMilisegundos);             
        this.setNroAlumno(resolucion[0]);
        this.setCodActividad(resolucion[1]);
        this.setSolucion(resolucion[2]);                
    }//Fin del metodo Resolucion(String[])

    
    /**
     * <hr>
     * authenticate(): Verifca que no haya otro elemento con los mismos atributos en la base de datos.
     * <hr>
     * @param nroAlumno
     * @param codActividad
     * @param solucion
     * @return <code>true</code> si no exite otro elemento con los mismos atributos en la base de datos
     * o <code>false</code> en caso contrario.
     */    
    public static boolean authenticate(String nroAlumno, String codActividad, String solucion) {
        try {
            Resolucion r = Resolucion.getResolucionByKeys(nroAlumno, codActividad);
            if (r.getSolucion().equals(solucion)){
                return true;
            }
            return false;
        } catch (resolucionNotFound ex) {
            return false;
        }
    }//Fin del metodo authenticate(String, String, String)

    
    /**
     * <hr>
     * save():Guarda una resolucion en la base de datos.
     * Intenta obtener una resolucion de la base de datos si lo logra o
     * por cualquier problema que ocurra al intentar obtenerlo o guardarlo retorna false, 
     * pero si logra guardar la resolucion retorna true.
     * <hr>
     * @return <code>true</code> si logra guardar la resolucion,
     * <code>false</code> si ya existe el elemento o que ocurra algun problema.
     */ 
    public boolean save() {
        try {   //Se intenta obtener una resolucion
            Resolucion.getResolucionByKeys(nroAlumno, codActividad);                        
            return false;
	} catch (resolucionNotFound e1) {
            String[] columns = { "fecha", "hora",  "nroAlumno", "codActividad", "solucion" };
            PreparedStatement stm = jpa.newRecord("educar_dev.resolucion", columns);
            try {   //Intenta setear los datos
                stm.setDate(1, fecha);
		stm.setTime(2, hora);                                
		stm.setString(3, nroAlumno);
		stm.setString(4, codActividad);                                
                stm.setString(5, solucion);
            } catch (SQLException e) {  //Ocurrio un error al intentar ingresar la resolucion
                e.printStackTrace();
		return false;
            }
            jpa.create(stm);    //Guarda la resolucion en la base de datos
            return true;
	}
    }//Fin del metodo save()

    
    /**
     * <hr> 
     * destroy(): Elimina una resolucion de la base de datos
     * <hr>
     */
    public void destroy() {
        String[] keys = { "nroAlumno", "codActividad" };
        String[] ids = {this.getNroAlumno(), this.getCodActividad()};
	jpa.destroyByKeys("pertenece", keys , ids);
    }//Fin del metodo destroy()

    
    /**
     * <hr>
     * destroyResolucionByKeys(): Metodo estatico usado para eliminar una resolucion de la base de datos
     * pasandole como parametro los atributos clave de la base de datos.
     * <hr>
     * @param nroAlumno
     * @param codActividad
     */  
    public static void destroyResolucionByKeys(String nroAlumno, String codActividad) {
        String[] keys = { "nroAlumno", "codActividad" };
        String[] ids = {nroAlumno, codActividad};
        jpa.destroyByKeys("pertenece", keys , ids);
    }//Fin del metodo destroyDedicacionByKeys(Strin, String)        

    
    /**
     * <hr>
     * getResolucionByKeys(): Dado los atributos clave de la base de datos, consulto la base de datos
     * usando estos atributos para obtener todos los datos del mismo, en el caso que este 
     * no se encuentre lanza una excepcion resolucionNotFound.
     * <hr>
     * @param nroAlumno
     * @param codActividad
     * @return Resolucion
     * @throws resolucionNotFound en caso de no encontrar la resolucion buscada.
     */
    public static Resolucion getResolucionByKeys(String nroAlumno, String codActividad) throws resolucionNotFound {
        //Consulto en la base de datos la tabla resolucion, usando nroAlumno y codActividad como clave
        ResultSet rs = null;
	Resolucion r = null;
        String[] keys = {"nroAlumno", "codActividad"};
        String[] ids = {nroAlumno, codActividad};
	rs = jpa.getByKeys("resolucion", keys , ids);
	try {
            if (rs.next()) {
                r = new Resolucion (rs.getString(5), rs.getString(6), rs.getString(7));
            } else {
                throw new resolucionNotFound();
            }
	} catch (SQLException e) {
            e.printStackTrace();
	}
	return r;
    }//Fin del metodo getResolucionByKeys(String, String).

    
    /**
     * <hr>
     * setResolucionByKeys(): Este metodo modifica a una resolucion usando sus atributos clave.
     * <hr>
     * @param oldNroAlumno uno de los atributos clave de la resolucion que quiero modificar
     * @param oldCodActividad el otro atributo clave de la resolucion que quiero modificar.
     */
    public boolean setResolucionByKeys (String oldNroAlumno, String oldCodActividad) {
        String[] keys = {"nroAlumno", "codActividad"};
        String[] ids = {oldNroAlumno, oldCodActividad};             
        jpa.updateByKeys("resolucion", "solucion", solucion, keys, ids);
        jpa.updateByKeys("resolucion", "codActividad", codActividad, keys, ids);
        ids[1] = codActividad;
        jpa.updateByKeys("resolucion", "nroAlumno", nroAlumno, keys, ids);
        return true;
    }//Fin de la clase setResolucionByKeys(String, String)

    
    /**
     * Codigo de una Actividad de una Resolucion
     * @return codActividad
     */
    public String getCodActividad() {
        return codActividad;
    }

    
    /**
     * Asigna un codigo de una Actividad a una Resolucion
     * @param dniDocente 
     */
    public void setCodActividad(String codActividad) {
        this.codActividad = codActividad;
    }

    
    /**
     * Numero de un Alumno de una Resolucion
     * @return nroAlumno
     */
    public String getNroAlumno() {
        return nroAlumno;
    }

    
    /**
     * Asigna un numero de un Alumno a una Resolucion
     * @param nroAlumno 
     */
    public void setNroAlumno(String nroAlumno) {
        this.nroAlumno = nroAlumno;
    }

    
    /**
     * Solucion de una Resolucion
     * @return solucion
     */
    public String getSolucion() {
        return solucion;
    }

    
    /**
     * Asigna una Solucion a una Resolucion
     * @param solucion 
     */
    public void setSolucion(String solucion) {
        this.solucion = solucion;
    }     
}//Fin de la clase Resolucion.
